草庐IT

C++ ostringstream 奇怪的行为

全部标签

c++ - std::sort 具有相等整数的行为

当std::sort与相等的整数一起使用时,它的行为是什么?它会让它们保持相同的顺序还是只是做一些不可预测的事情? 最佳答案 std::sort不保留等效元素的顺序,std::stable_sort做。但是,如果是int,您将不会注意到差异,除非您使用一些非平凡的顺序,如下例所示:structhalf_less{booloperator()(inta,intb)const{return(a/2)Hereisanotherexample当std::stable_sort比std::sort更合适时

C++ 指针的打印值给出了奇怪的结果

当我编译并运行此C++代码时,我没有得到预期的输出。#includeusingnamespacestd;intmain(){int*i=newint;long*l=newlong;char*c=newchar[100];float*f=newfloat[100];cout在unix机器上我得到i0x967f008l0x967f018cf0x967f090在Windows机器上,c的值打印为一行随机字符。请有人解释为什么它没有正确打印char数组的指针。谢谢 最佳答案 operator对于std::ostream和std::wostr

c++ - const_cast 的未定义行为

我希望有人能准确阐明C++中未定义行为的含义。给定以下类定义:classFoo{public:explicitFoo(intValue):m_Int(Value){}voidSetValue(intValue){m_Int=Value;}private:Foo(constFoo&rhs);constFoo&operator=(constFoo&rhs);private:intm_Int;};如果我理解正确,下面代码中指向引用和指针的两个const_casts将删除Foo类型的原始对象的常量性,但是通过指针或引用将导致未定义的行为。intmain(){constFooMyConstFoo

c++ - 链接到 opencv 的奇怪链接器错误... "LNK1107: invalid or corrupt file: cannot read at 0x2E8"

这个OpenCV构建在几天前对我有用。我正在尝试运行随OpenCV示例给出的示例grabcut.cpp文件,因此我设置了一个快速项目并引入了cpp文件。然后,我设置了所有标准配置并在构建时出现此错误。errorLNK1107:invalidorcorruptfile:cannotreadat0x2E8opencv_calib3d231.dll这是什么意思? 最佳答案 如果我不得不猜测(部分基于thedocumentationofthaterror),我会说您正在尝试直接链接到DLL。您可能想要链接到其相应的.lib文件。

c++ - const 的奇怪使用 - 为什么编译?

我最近在审查的一些代码中发现了以下函数定义:voidfunc(const::std::string&str){//Dosomething...}令我惊讶的是const::std::string似乎是合法的(它使用GCC4.4、GCC4.8、Clang3.2和Intel13.0.1编译)。标准是否指定const可以用作命名空间? 最佳答案 Doesthestandardspecifythatconstcanbeusedasanamespace?不,它不会,因为它不可能。您的代码与:voidfunc(const::std::string

c++ - 表达式的行为 : Defined or Undefined?

我有以下代码intm[4]={1,2,3,4},*y;y=m;*y=f(y++);//ExpressionA我的friend告诉我,表达式A具有明确定义的行为,但我不确定他是否正确。根据他的说法,函数f()在两者之间引入了一个sequencepoint,因此行为定义明确。有人请澄清。P.S:我知道我们不应该出于实际目的编写这样的代码。这只是为了学习。:) 最佳答案 充其量,相关代码具有未指定的行为。对于赋值运算符,“操作数的求值顺序未指定”(C99§6.5.16/4)。如果先计算左操作数,则f(y++)的结果将存储在m[0]中。如果

c++ - 为什么 float 变量通过以一种奇怪的方式在点后切割数字来保存值?

我有这个简单的代码行:floatval=123456.123456;当我打印此val或查看范围时,它存储值123456.13好吧,没关系,它不能只用4个字节存储点之后的所有数字,但为什么它在点之后是13?不应该是12吗?(在win32上使用vc++2010express) 最佳答案 在二进制中,123456.123456是11110001001000000.000111111001...(无穷大)。它四舍五入为11110001001000000.001,即123456.125。打印时四舍五入为123456.13。

c++ - g++ 6.1 可能的 std::forward 回归 - 错误或预期行为?

g++6.1最近被引入到ArchLinux的测试库中,我的一些使用g++5.3.0成功编译的代码不再编译。我做了一个最小的例子:gcc.godbolt.orglink//Thiscodecompileswithg++5.3.0//Thisdoesnotcompilewithg++6.1#include#include#include#defineFWD(...)::std::forward(__VA_ARGS__)structsinker{templatevoidsink(T&){}};templatevoidcaller(T&v,TF&&f){sinkers;f(s,v);}temp

c++ - 指向多态类的悬挂指针会导致未定义的行为。它真的可以成为任何可以想象的腐败的根源吗?

我知道未定义行为一旦发生,就无法再考虑代码了。我完全相信。我什至认为我不应该深入了解UB:一个理智的C++程序不应该使用UB,Period。但为了让我的同事和经理相信它的真正危险,我试图找到一个具体的例子,我们的产品确实存在一个错误(他们认为这并不危险,最坏的情况是总是因访问冲突而崩溃)。我主要关心的是在指向多态类的悬垂指针上调用虚拟成员函数。当一个指针被删除时,Windows操作系统会在堆block的头部写入几个字节,通常也会覆盖堆block本身的第一个字节。这是它跟踪堆block的方式,将它们作为链表进行管理……操作系统的东西。虽然它没有在C++标准中定义,但多态性是使用虚拟表AF

c++ - 未定义的行为会影响 static_assert 吗?

考虑以下代码:SomeTypex=getX();for(automask=1u=sizeofx,"Typeofnumericparameteristoolong");/*...*/}此处,mask的类型为unsigned。假设SomeType是longlong。然后mask的初始化将由于移位太多而具有未定义的行为。但是OTOH,有一个static_assert,它检查未定义的行为不会在运行时发生(因为代码将无法编译)。但由于UB会导致时间悖论和其他意外情况,我不太确定static_assert能否保证在这种情况下实际工作。有什么理由可以确定这一点吗?或者是否应该重做此代码以使stati